/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

import com.evangelion.core.bean.Cliente;
import com.evangelion.core.bean.Grupo;
import com.evangelion.core.bean.Vehiculo;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.bean.Usuario;
import com.evangelion.core.bean.Vehiculo;
import com.evangelion.core.daoImpl.GenericDaoImpl;
import com.evangelion.core.service.ProfesorService;
import com.evangelion.core.service.VehiculoService;
import com.evangelion.core.serviceImpl.ProfesorServiceImpl;
import com.evangelion.core.serviceImpl.VehiculoServiceImpl;
import com.evangelion.core.daoImpl.ConnectionUtil;
import com.evangelion.core.utils.GrupoConverter;
import com.evangelion.core.utils.MensajesFace;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.convert.FacesConverter;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.model.DefaultStreamedContent;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Kellycasma
 */
@ManagedBean
@ViewScoped
public class VehiculoController extends MensajesFace implements Serializable {

    private Vehiculo vehiculo;
//    GenericDaoImpl<Serializable> gdi = new GenericDaoImpl<Serializable>();
    VehiculoService gdi = new VehiculoServiceImpl();
    String valorBusqueda;
    Date fechaI;
    Date fechaF;
    List<Vehiculo> listaVehiculo;
    List<SelectItem> listaGruposelect;
    Usuario usu;
    Seccione seccion;
    List<Grupo> listaGrupo;
    DefaultStreamedContent dc;
          

    @PostConstruct
    public void init() {
        vehiculo = new Vehiculo();
        listaGruposelect = new ArrayList<SelectItem>();
        vehiculo.setCliente(new Cliente());
        vehiculo.setSeccion(new Seccione());
        vehiculo.setGrupo(new Grupo());
        listaVehiculo = new ArrayList<Vehiculo>();
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        HttpSession httpSession = request.getSession(false);
        if (httpSession != null) {
            usu = (Usuario) httpSession.getAttribute("UserSession");
            seccion = (Seccione) httpSession.getAttribute("seccion");
        }
        listaVehiculo = gdi.findListByParamSeccion(seccion, "matricula", "");
//        listaGrupo = GrupoConverter.linkTypesDB;
//        System.out.println("listaGrupo:" + listaGrupo.size());
//        for (Grupo grupo : listaGrupo) {
//            listaGruposelect.add(new SelectItem(grupo, grupo.getNombre()));
//        }
    }

    public List<Grupo> getListaGrupo() {
        return listaGrupo;
    }

    public void setListaGrupo(List<Grupo> listaGrupo) {
        this.listaGrupo = listaGrupo;
    }

    public void save() {
        if (validarForm() && validarMattricula()) {

            vehiculo.setCliente(usu.getCliente());
            vehiculo.setSeccion(seccion);

//            if (vehiculo.getId() == null) {
//                vehiculo.setFechaCreacion(new Date());
//            }
//            vehiculo.setFechaActualizacion(new Date());
//            System.out.println("fechaactualizacion:"+vehiculo.getFechaActualizacion());
            gdi.save(vehiculo);
            limpiarForm();
            msgCambiosGuardados();
            init();
        }
        System.out.println("imprimir" + vehiculo.getMatricula());
    }

    public void limpiarForm() {
        vehiculo = new Vehiculo();
    }

    public Vehiculo getVehiculo() {
        return vehiculo;
    }

    public boolean validarForm() {
        boolean requerido = true;
//        if (!validarNIF(vehiculo.getMatricula())) {
//            msgValidacion("EL NIF");
//            requerido = false;
//        }
        try {
            Vehiculo vehiculoTemporal = gdi.findObjByParam("matricula", vehiculo.getMatricula());
            if (vehiculoTemporal != null) {
                if ((vehiculo.getId() == null || (!vehiculo.getId().equals(vehiculoTemporal.getId()) && vehiculo.getId() != null))) {
                    msgValidacion("Matricula existente");
                    requerido = false;
                } else {
                    if (vehiculo.getId() != null) {
                        vehiculo.setMatricula(vehiculoTemporal.getMatricula());
                    }
                }
            }
        } catch (Exception ex) {
            msgValidacion("Ha ocurrido un error");
            return false;
        }
        return requerido;
    }

    public void search() {
        System.out.println("...valorBusqueda" + valorBusqueda);
        listaVehiculo = gdi.findListByParamSeccion(seccion, "matricula", valorBusqueda);
        System.out.println(".........................." + listaVehiculo.size());
    }

    public boolean validarMattricula() {
        boolean bien = false;
        Pattern pattern = Pattern.compile("([0-9]{4})([A-Za-z]{3})");
        Matcher matcher = pattern.matcher(vehiculo.getMatricula());
        if (matcher.find()) {
            System.out.println("Valor Encontrado..............." + matcher.group(1) + " " + matcher.group(2));
            bien = true;
        } else {
            msgValidacion("La matricula");
            System.out.println("Error en la expresion..............");
        }

        return bien;
    }

    public void printpdf(Map parameters, String archivo) {
        try {
            Connection conexion = ConnectionUtil.getConnection();
            String urlMaster = ConnectionUtil.getServletContext().getRealPath(File.separator + "general" + File.separator + "reportes" + File.separator + archivo);
            JasperReport reporteMaster = null;
            try {
                reporteMaster = (JasperReport) JRLoader.loadObject(urlMaster);
            } catch (Exception e) {
                e.printStackTrace();
            }
            JasperPrint print = null;
            print = JasperFillManager.fillReport(reporteMaster, parameters, conexion);
            byte[] bytes = JasperExportManager.exportReportToPdf(print);
            System.out.println("byte: " + bytes.length);
            if (bytes.length >= 1211 && bytes.length <= 1608) {
                System.out.println("tamano menor");
                dc = null;
                msgValidacion("El reporte no genero ningun resultado");
            } else {
                InputStream stream = new ByteArrayInputStream(bytes);
                dc = new DefaultStreamedContent(stream, "application/pdf", "Archivo.pdf");
                System.out.println("Reporte generado exitosamente.");
            }
            ConnectionUtil.closeConect();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void prueba(String matr, Date fechaI, Date fechaF) {
        Pattern pattern = Pattern.compile("([0-9]{4})([A-Za-z]{3})");
        Matcher matcher = pattern.matcher(matr);
        if (matcher.find()) {
            String archivo = "reporteMtoVehiculo.jasper";
            Map parameters = new HashMap();
            parameters.put("matricula", matr);
            parameters.put("fechaI", fechaI);
            parameters.put("fechaF", fechaF);
            printpdf(parameters, archivo);
        } else {
            msgValidacion("La matricula");
            System.out.println("Error en la expresion..............");
        }
    }

    public String getValorBusqueda() {
        return valorBusqueda;
    }

    public List<Vehiculo> getListaVehiculo() {
        return listaVehiculo;
    }

    public void setListaVehiculo(List<Vehiculo> listaVehiculo) {
        this.listaVehiculo = listaVehiculo;
    }

    public void setValorBusqueda(String valorBusqueda) {
        this.valorBusqueda = valorBusqueda;
    }

    public void setVehiculo(Vehiculo vehiculo) {
        this.vehiculo = vehiculo;
    }

    public List<SelectItem> getListaGruposelect() {
        return listaGruposelect;
    }

    public void setListaGruposelect(List<SelectItem> listaGruposelect) {
        this.listaGruposelect = listaGruposelect;
    }

    public DefaultStreamedContent getDc() {
        return dc;
    }

    public void setDc(DefaultStreamedContent dc) {
        this.dc = dc;
    }

    public Date getFechaI() {
        return fechaI;
    }

    public void setFechaI(Date fechaI) {
        this.fechaI = fechaI;
    }

    public Date getFechaF() {
        return fechaF;
    }

    public void setFechaF(Date fechaF) {
        this.fechaF = fechaF;
    }
}
